import axios from 'axios'
import {
	ElMessage
} from 'element-plus'
import {
	getToken,
	removeToken
} from '@/utils/token.js'

// 启动时校验必要变量
if (!import.meta.env.VITE_API_BASE_URL) {
	throw new Error("Missing VITE_API_BASE_URL in .env file!")
}

// 创建带默认配置的实例
const request = axios.create({
	baseURL: import.meta.env.VITE_API_BASE_URL, // 通过.env文件配置(Vite语法)
	timeout: 10000,
	headers: {
		'Content-Type': 'application/json'
	}
})

// 请求拦截器（添加token）
request.interceptors.request.use(config => {
	const token = getToken()

	if (token) {
		config.headers.Authorization = `${token}`
	}
	return config
})

/**
 * 不需要被拦截的状态码
 */
const successStatusCodes = [200, 201, 204]

// 响应拦截器（统一错误处理）
request.interceptors.response.use(
	response => {
		// 统一处理业务错误码
		if (!successStatusCodes.includes(response.data.code)) {
			// 构建错误信息
			let errorMessage = response.data?.message
			const errors = response.data?.errors

			// 优先使用 errors 数组内容
			if (Array.isArray(errors) && errors.length > 0) {
				errorMessage = errors.join('\n') // 多行显示错误
			}

			// 兜底处理
			if (!errorMessage) {
				errorMessage = `请求失败（错误码：${response.data.code}）`
			}

			// 显示错误弹窗（支持多行）
			ElMessage.error({
				message: errorMessage,
				duration: 5000, // 延长显示时间
				showClose: true, // 显示关闭按钮
				grouping: true // 合并相同内容
			})

			// 抛出包含完整错误信息的错误对象
			return Promise.reject(new Error(errorMessage, {
				cause: {
					code: response.data.code,
					originalMessage: response.data.message,
					errors: errors || []
				}
			}))
		}

		// 正常返回数据
		return response.data
	},

	error => {
		if (error.response) { // 确保 response 存在
			if (error.response.code === 401) {
				router.push('/unauthorized');
				return Promise.resolve();
			}
		} else {
			console.error('Network Error:', error.message);
		}
		// 继续传递错误
		return Promise.reject(error);
	}
);

export default request